/*
** $ 身份：嘞只入出.c $
** 缓冲流
** 请参见lua.h中的版权声明
*/

#define 嘞只入出_西
#define 炉啊_核

#include "嘞前缀.h"

#include <string.h>

#include "炉啊.h"
#include "嘞极限.h"
#include "嘞内存.h"
#include "嘞国.h"
#include "嘞只入出.h"

int 炉啊只_填 (只入出 *只) {
  size_t 大小;
  炉啊_国 *嘞 = 只->嘞;
  const char *缓冲冲;
  炉啊_开锁(嘞);
  缓冲冲 = 只->读者(嘞, 只->数据, &大小);
  炉啊_锁(嘞);
  if (缓冲冲 == NULL || 大小 == 0)
    return 只终;
  只->恩 = 大小 - 1;  /* 折扣印刻被退回 */
  只->匹 = 缓冲冲;
  return 投_由印刻(*(只->匹++));
}

void 炉啊只_初始 (炉啊_国 *嘞, 只入出 *只, 炉啊_读者 读者, void *数据) {
  只->嘞 = 嘞;
  只->读者 = 读者;
  只->数据 = 数据;
  只->恩 = 0;
  只->匹 = NULL;
}

/* ----- 读 --- */
size_t 炉啊只_读 (只入出 *只, void *哔, size_t 恩) {
  while (恩) {
    size_t 摸;
    if (只->恩 == 0) {  /* 缓冲区中没有字节? */
      if (炉啊只_填(只) == 只终)  /* 尝试阅读更多 */
        return 恩;  /* 没有更多的输入; 返回丢失的字节数 */
      else {
        只->恩++;  /* 炉啊只_填 消耗的第一个字节; 放回去 */
        只->匹--;
      }
    }
    摸 = (恩 <= 只->恩) ? 恩 : 只->恩;  /* 最小. 在 恩 和 只->恩 之间 */
    memcpy(哔, 只->匹, 摸);
    只->恩 -= 摸;
    只->匹 += 摸;
    哔 = (char *)哔 + 摸;
    恩 -= 摸;
  }
  return 0;
}